#pragma once
#include <fstream>
#include <vector>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <map>

/*****************************************
 * 
 * 从文件中读取在剪枝之前确定的的设备id
 * 函数会根据这个设备 id 来确定问题的上界
 * 
 * line_id: 指定读入文件的第 line_id 行
 *****************************************/
std::vector<int> init_fac_id(std::string file_name="fac_id.txt", int line_id=1);


/*****************************************
 *
 * 根据选出的设施 id ，计算原问题的解
 * Args:
 *		distant: 距离矩阵，外层的 int 代表用户的 id
 *		fac_id: 选出来的设施 id
 *		visit_num: 要统计的每个设施被多少个用户访问，如果时 nullptr ，则不统计
 *
 * Return:
 *		在当前设施集下，原问题的解（最小距离）
 * 
 *****************************************/
double calculate_original_dist(std::unordered_map<int, std::unordered_map<int, double>>& distance, std::vector<int>& fac_id, std::unordered_map<int, int>& visit_num);
double calculate_original_dist(std::unordered_map<int, std::unordered_map<int, double>>& distance, std::vector<int>& fac_id);

/*****************************************
 *
 * 根据选出的设施 id ，计算原问题的解，如上述函数的最用相同，只是不会统计访问数量
 * Args:
 *		distant: 距离矩阵，外层的 int 代表用户的 id
 *		fac_id: 选出来的设施 id
 *
 * Return:
 *		在当前设施集下，原问题的解（最小距离）
 * 
 *****************************************/
double calculate_original_dist(std::unordered_map<int, std::unordered_map<int, double>>& distance, std::map<int, double>& fac_id);

double calculate_original_dist(std::unordered_map<int, std::unordered_map<int, double>>& distance, std::unordered_set<int>& fac_id);
